

<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
  <meta charset="utf-8" />
  <meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />

  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  
  <title>MDS 缓存配置 &mdash; Ceph Documentation</title>
  

  
  <link rel="stylesheet" href="../../_static/ceph.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/ceph.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/graphviz.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/css/custom.css" type="text/css" />

  
  

  
  

  

  
  <!--[if lt IE 9]>
    <script src="../../_static/js/html5shiv.min.js"></script>
  <![endif]-->
  
    
      <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
        <script src="../../_static/jquery.js"></script>
        <script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
        <script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
        <script src="../../_static/doctools.js"></script>
        <script src="../../_static/sphinx_highlight.js"></script>
    
    <script type="text/javascript" src="../../_static/js/theme.js"></script>

    
    <link rel="index" title="Index" href="../../genindex/" />
    <link rel="search" title="Search" href="../../search/" />
    <link rel="next" title="MDS 配置参考" href="../mds-config-ref/" />
    <link rel="prev" title="术语" href="../standby/" /> 
</head>

<body class="wy-body-for-nav">

   
  <header class="top-bar">
    <div role="navigation" aria-label="Page navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="../../" class="icon icon-home" aria-label="Home"></a></li>
          <li class="breadcrumb-item"><a href="../">Ceph 文件系统</a></li>
      <li class="breadcrumb-item active">MDS 缓存配置</li>
      <li class="wy-breadcrumbs-aside">
            <a href="../../_sources/cephfs/cache-configuration.rst.txt" rel="nofollow"> View page source</a>
      </li>
  </ul>
  <hr/>
</div>
  </header>
  <div class="wy-grid-for-nav">
    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-scroll">
        <div class="wy-side-nav-search"  style="background: #eee" >
          

          
            <a href="../../" class="icon icon-home"> Ceph
          

          
          </a>

          

          
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="../../search/" method="get">
    <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

          
        </div>

        
        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
          
            
            
              
            
            
              <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../start/">Ceph 简介</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../install/">安装 Ceph</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../cephadm/">Cephadm</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../rados/">Ceph 存储集群</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../">Ceph 文件系统</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../#cephfs">CephFS 入门</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="../#id4">管理</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="../createfs/"> 创建 CephFS 文件系统</a></li>
<li class="toctree-l3"><a class="reference internal" href="../administration/"> 管理命令</a></li>
<li class="toctree-l3"><a class="reference internal" href="../multifs/"> 创建多个文件系统</a></li>
<li class="toctree-l3"><a class="reference internal" href="../add-remove-mds/"> 配备、增加、删除 MDS</a></li>
<li class="toctree-l3"><a class="reference internal" href="../standby/">术语</a></li>
<li class="toctree-l3"><a class="reference internal" href="../standby/#mds">MDS 守护进程的引用</a></li>
<li class="toctree-l3"><a class="reference internal" href="../standby/#id3">故障切换的管理</a></li>
<li class="toctree-l3"><a class="reference internal" href="../standby/#standby-replay">热备（ standby-replay ）的配置</a></li>
<li class="toctree-l3"><a class="reference internal" href="../standby/#mds-join-fs">配置 MDS 与文件系统的亲和性</a></li>
<li class="toctree-l3 current"><a class="current reference internal" href="#"> MDS 缓存配置</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#id1">MDS 缓存尺寸</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id2">MDS 缓存修剪</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id3">MDS 回收</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id4">MDS 能力获取节制</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id5">会话存活性</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id6">能力限额</a></li>
<li class="toctree-l4"><a class="reference internal" href="#clients-failing-to-respond-to-cache-pressure">处理消息 “clients failing to respond to cache pressure”</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../mds-config-ref/"> MDS 配置选项</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../man/8/ceph-mds/"> ceph-mds 手册页</a></li>
<li class="toctree-l3"><a class="reference internal" href="../nfs/"> 通过 NFS 导出</a></li>
<li class="toctree-l3"><a class="reference internal" href="../app-best-practices/"> 应用最佳实践</a></li>
<li class="toctree-l3"><a class="reference internal" href="../fs-volumes/"> FS 卷和子卷</a></li>
<li class="toctree-l3"><a class="reference internal" href="../quota/"> CephFS 配额管理</a></li>
<li class="toctree-l3"><a class="reference internal" href="../health-messages/"> 健康消息</a></li>
<li class="toctree-l3"><a class="reference internal" href="../upgrading/">升级 MDS 集群</a></li>
<li class="toctree-l3"><a class="reference internal" href="../upgrading/#firefly-jewel">升级比 Firefly 老的文件系统，需过 Jewel 这个槛</a></li>
<li class="toctree-l3"><a class="reference internal" href="../cephfs-top/"> CephFS Top 工具</a></li>
<li class="toctree-l3"><a class="reference internal" href="../snap-schedule/"> 定时快照</a></li>
<li class="toctree-l3"><a class="reference internal" href="../cephfs-mirroring/"> CephFS 快照镜像</a></li>
<li class="toctree-l3"><a class="reference internal" href="../purge-queue/"> 清理队列</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../#id5">挂载 CephFS</a></li>
<li class="toctree-l2"><a class="reference internal" href="../#id6">CephFS 内幕</a></li>
<li class="toctree-l2"><a class="reference internal" href="../#id7">故障排除和灾难恢复</a></li>
<li class="toctree-l2"><a class="reference internal" href="../#id9">更多细节</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../rbd/">Ceph 块设备</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../radosgw/">Ceph 对象网关</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../mgr/">Ceph 管理器守护进程</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../mgr/dashboard/">Ceph 仪表盘</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../monitoring/">监控概览</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../api/">API 文档</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../architecture/">体系结构</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../dev/developer_guide/">开发者指南</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../dev/internals/">Ceph 内幕</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../governance/">项目管理</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../foundation/">Ceph 基金会</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../ceph-volume/">ceph-volume</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../releases/general/">Ceph 版本（总目录）</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../releases/">Ceph 版本（索引）</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../security/">Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../hardware-monitoring/">硬件监控</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../glossary/">Ceph 术语</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../jaegertracing/">Tracing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../translation_cn/">中文版翻译资源</a></li>
</ul>

            
          
        </div>
        
      </div>
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" aria-label="top navigation">
        
          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
          <a href="../../">Ceph</a>
        
      </nav>


      <div class="wy-nav-content">
        
        <div class="rst-content">
        
          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
            
<div id="dev-warning" class="admonition note">
  <p class="first admonition-title">Notice</p>
  <p class="last">This document is for a development version of Ceph.</p>
</div>
  <div id="docubetter" align="right" style="padding: 5px; font-weight: bold;">
    <a href="https://pad.ceph.com/p/Report_Documentation_Bugs">Report a Documentation Bug</a>
  </div>

  
  <section id="mds">
<h1>MDS 缓存配置<a class="headerlink" href="#mds" title="Permalink to this heading"></a></h1>
<p>元数据服务器协调着所有 MDS 和所有 CephFS 客户端之间的分布式缓存。
缓存的作用是改善元数据访问延迟，并允许客户端安全（连贯）地更改元数据状态（如通过 <cite>chmod</cite> ）。
MDS 会发布 <strong>能力</strong>和<strong>目录条目租约</strong>，
来指明客户端可以缓存哪些状态、以及客户端可以执行哪些操作（如写入文件）。</p>
<p>MDS 和客户端们都会尝试控制缓存大小。下文介绍了指定 MDS 缓存大小的机制。
注意， MDS 缓存大小不是硬性限制,
MDS 始终允许客户端查找加载到缓存中的新元数据。
这是一项必备策略，因为它能避免客户端请求中出现死锁
（某些请求可能依赖于持有的能力，是释放前持有的能力）。</p>
<p>当 MDS 缓存过大时， MDS 会<strong>回收（ recall ）</strong>客户端状态，
这样缓存项就会被解除锁定，可以安全丢弃。
MDS 只能丢弃那些没有客户端引用的元数据状态。
下文还介绍了如何根据工作负载的需要配置 MDS 回收选项。
如果 MDS 回收的内部节流跟不上客户端工作负载的速度，
就有必要这样做。</p>
<section id="id1">
<h2>MDS 缓存尺寸<a class="headerlink" href="#id1" title="Permalink to this heading"></a></h2>
<p>你可以通过一个字节计数来限制元数据服务器（ MDS ）的缓存大小，
通过 <cite>mds_cache_memory_limit</cite> 配置选项：</p>
<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_cache_memory_limit">
<span class="sig-name descname"><span class="pre">mds_cache_memory_limit</span></span><a class="headerlink" href="#confval-mds_cache_memory_limit" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>此选项设置 MDS 缓存的最大内存使用量， 它是限制 MDS 内存使用量的主要可调参数。 MDS 会修剪缓存中未使用的元数据，
并回收客户端缓存中的条目，让内存用量尽量保持在限制的范围内 （默认为 95% ； 1 - mds_cache_reservation
）。从客户端回收的速度较慢时， MDS 有可能超过这一限额。 mds_health_cache_threshold (150%)
设置了一个缓存满的阈值，达到时 MDS 发出集群健康警告。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">size</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">4Gi</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<p>另外，你可以用 <cite>mds_cache_reservation</cite> 配置一个缓存预留量，
用作 MDS 操作：</p>
<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_cache_reservation">
<span class="sig-name descname"><span class="pre">mds_cache_reservation</span></span><a class="headerlink" href="#confval-mds_cache_reservation" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>MDS 缓存（子系统）要维持的保留缓存空间（内存量或 inode 数量）。 MDS 一旦开始恢复其缓存保留量， 它会回调客户端状态，
直到它的缓存尺寸也缩减到空出保留值。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">0.05</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<p>缓存预留量是用一个百分比来限制的，默认为 5% 。
设立此参数的初衷是让 MDS 额外保留一些内存，
以供新的元数据操作使用。因此，通常 MDS 在内存限额以内运行，
因为它会从客户端回收旧条目，
以便丢弃自己缓存里没在用的元数据。</p>
<p>如果 MDS 无法将缓存保持在限额以内， MDS 就会向监视器发送健康警报，
说缓存太大了。这个由 <cite>mds_health_cache_threshold</cite> 配置控制，
默认值是最大缓存尺寸的 150% ：</p>
<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_health_cache_threshold">
<span class="sig-name descname"><span class="pre">mds_health_cache_threshold</span></span><a class="headerlink" href="#confval-mds_health_cache_threshold" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>产生健康警告的缓存尺寸阈值。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">1.5</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<p>由于缓存限额不是硬限制， CephFS 客户端、 MDS 中潜在的软件缺陷或行为不正常的应用程序可能会导致 MDS 缓存尺寸超额。
健康警告是为了帮助运维人员检测这种情况，并做出必要的调整或调查有问题的客户端。</p>
</section>
<section id="id2">
<h2>MDS 缓存修剪<a class="headerlink" href="#id2" title="Permalink to this heading"></a></h2>
<p>在 MDS 中，有两个配置选项可以控制缓存修剪的速度：</p>
<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_cache_trim_threshold">
<span class="sig-name descname"><span class="pre">mds_cache_trim_threshold</span></span><a class="headerlink" href="#confval-mds_cache_trim_threshold" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>可以修剪的 dentry 数量阈值。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">size</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">256Ki</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_cache_trim_decay_rate">
<span class="sig-name descname"><span class="pre">mds_cache_trim_decay_rate</span></span><a class="headerlink" href="#confval-mds_cache_trim_decay_rate" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>修剪 MDS 缓存节流的衰减率。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">1.0</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<p>节流的目的是防止 MDS 花过多时间修剪缓存。
这可能会影响它处理客户端请求或执行其他维护的能力。</p>
<p>修剪配置控制着一个内部<strong>衰减计数器</strong>。
每次从缓存中删除元数据时，计数器都会递增。
阈值设定了计数器的最大尺寸，而衰减率则表示计数器的指数半衰期。
如果 MDS 不断从缓存中删除条目，它最终会达到每秒删除
<code class="docutils literal notranslate"><span class="pre">-ln(0.5)/rate*threshold</span></code> 个条目的稳定状态。</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>增加配置选项 <code class="docutils literal notranslate"><span class="pre">mds_cache_trim_decay_rate</span></code> 的值会让 MDS 花更少的时间修剪缓存。
要提高缓存修剪速率，
可以设置一个比较低的值。</p>
</div>
<p>默认值比较保守，缓存容量较大的生产集群 MDS
可能需要更改此值。</p>
</section>
<section id="id3">
<h2>MDS 回收<a class="headerlink" href="#id3" title="Permalink to this heading"></a></h2>
<p>MDS 约束着对客户端状态（能力/租约）的回收，
以避免在处理客户端释放消息时产生过多工作。
这个行为通过以下配置进行控制：</p>
<p>在一次给定的回收事件中，
从单个客户端回收能力的最大数量：</p>
<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_recall_max_caps">
<span class="sig-name descname"><span class="pre">mds_recall_max_caps</span></span><a class="headerlink" href="#confval-mds_recall_max_caps" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>在单次回收中，可以从客户端会话中回收能力的最大数量</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">size</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">30000B</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<p>一个会话中，衰减计数器的阈值和衰减率：</p>
<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_recall_max_decay_threshold">
<span class="sig-name descname"><span class="pre">mds_recall_max_decay_threshold</span></span><a class="headerlink" href="#confval-mds_recall_max_decay_threshold" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>一个会话中，回收能力时节流的衰减阈值</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">size</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">128Ki</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_recall_max_decay_rate">
<span class="sig-name descname"><span class="pre">mds_recall_max_decay_rate</span></span><a class="headerlink" href="#confval-mds_recall_max_decay_rate" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>一个会话中，回收能力时节流的衰减率。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">1.5</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<p>会话衰减计数器控制着单个会话的回收率。
计数器的工作原理与上述缓存修剪相同。
每回收一次能力，计数器就会增加一次。</p>
<p>另外还有一个全局衰减计数器，用于节制所有会话的回收：</p>
<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_recall_global_max_decay_threshold">
<span class="sig-name descname"><span class="pre">mds_recall_global_max_decay_threshold</span></span><a class="headerlink" href="#confval-mds_recall_global_max_decay_threshold" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>用于节制回收能力的衰减阈值，全局的。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">size</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">128Ki</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<p>其衰减率与 <code class="docutils literal notranslate"><span class="pre">mds_recall_max_decay_rate</span></code> 相同。
所有会话的每一次回收能力都会使这个计数器递增。</p>
<p>如果客户端释放状态的速度较慢，就会出现警告： “failing to respond to cache pressure
（未能及时响应缓存压力）” 或 <code class="docutils literal notranslate"><span class="pre">MDS_HEALTH_CLIENT_RECALL</span></code> 。
每个会话的释放速率由另一个衰减计数器监视，用下面的选项配置：</p>
<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_recall_warning_threshold">
<span class="sig-name descname"><span class="pre">mds_recall_warning_threshold</span></span><a class="headerlink" href="#confval-mds_recall_warning_threshold" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>会话能力回收慢于这个衰减阈值就告警。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">size</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">256Ki</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_recall_warning_decay_rate">
<span class="sig-name descname"><span class="pre">mds_recall_warning_decay_rate</span></span><a class="headerlink" href="#confval-mds_recall_warning_decay_rate" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>会话能力回收的衰减速率比此值低就告警。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">60.0</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<p>每次释放能力后，计数器都会递增。
如果客户端释放能力的速度不够快，并且存在缓存压力，
计数器就会显示客户端释放状态的速度是否很慢。</p>
<p>某些载荷和客户端行为可能需要更快地回收客户端状态，
才能跟上获取能力的速度。建议根据需要增加上述计数器，
以消除集群健康状态中、关于回收慢的警告。</p>
</section>
<section id="id4">
<h2>MDS 能力获取节制<a class="headerlink" href="#id4" title="Permalink to this heading"></a></h2>
<p>在大型目录树上执行一个微不足道的 find 命令，
就会导致客户端接收能力的速度大大超过它释放的速度。
MDS 会尝试让客户端把它的能力降低到 <code class="docutils literal notranslate"><span class="pre">mds_max_caps_per_client</span></code> 限额以下，
但回收节流机制会阻止它赶上获取能力的速度。
因此，为了控制能力获取速度， readdir 就被节流了，
配置选项如下：</p>
<p>readdir 能力获取衰减计数器的阈值和衰减率：</p>
<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_session_cap_acquisition_throttle">
<span class="sig-name descname"><span class="pre">mds_session_cap_acquisition_throttle</span></span><a class="headerlink" href="#confval-mds_session_cap_acquisition_throttle" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>能力获取衰减计数器开始节流的阈值。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">uint</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">100000</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_session_cap_acquisition_decay_rate">
<span class="sig-name descname"><span class="pre">mds_session_cap_acquisition_decay_rate</span></span><a class="headerlink" href="#confval-mds_session_cap_acquisition_decay_rate" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>readdir 获取能力的会话能力获取计数器（ session cap acquisition counter
）的半衰期。此选项用于节制客户端的 readdir 请求。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">30.0</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<p>能力获取衰减计数器控制着 readdir 获取能力的速率。
衰减计数器的作用与缓存修剪或能力回收相同。
每次调用 readdir 都会增加计数器，
增加的数量就是结果中的文件数。</p>
<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_session_max_caps_throttle_ratio">
<span class="sig-name descname"><span class="pre">mds_session_max_caps_throttle_ratio</span></span><a class="headerlink" href="#confval-mds_session_max_caps_throttle_ratio" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>客户端必须超过 mds_max_caps_per_client 的速率， 能力获取节流机制才会节制 readdir 。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">1.1</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_cap_acquisition_throttle_retry_request_timeout">
<span class="sig-name descname"><span class="pre">mds_cap_acquisition_throttle_retry_request_timeout</span></span><a class="headerlink" href="#confval-mds_cap_acquisition_throttle_retry_request_timeout" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>因能力获取节流导致超时， 超过这个秒数客户端才重试请求。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">0.5</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<p>如果客户端每个会话获取的能力数量大于 <code class="docutils literal notranslate"><span class="pre">mds_session_max_caps_throttle_ratio</span></code> ，
且能力获取衰减计数器大于 <code class="docutils literal notranslate"><span class="pre">mds_session_cap_acquisition_throttle</span></code> ，
就对 readdir 进行节流。 readdir 请求会在
<code class="docutils literal notranslate"><span class="pre">mds_cap_acquisition_throttle_retry_request_timeout</span></code> 秒后重试。</p>
</section>
<section id="id5">
<h2>会话存活性<a class="headerlink" href="#id5" title="Permalink to this heading"></a></h2>
<p>MDS 还会持续跟踪会话是否静默。
如果客户端会话没有使用其能力或静默着，
即使缓存没有压力， MDS 也会开始从会话中回收空间。
这有助于 MDS 避免以后在集群载荷较高且迫于缓存压力才回收状态。
我们的预期是，未使用其能力的客户端在近期内也不太可能使用这些能力。</p>
<p>判断指定的会话是否静默，
由以下配置选项控制：</p>
<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_session_cache_liveness_magnitude">
<span class="sig-name descname"><span class="pre">mds_session_cache_liveness_magnitude</span></span><a class="headerlink" href="#confval-mds_session_cache_liveness_magnitude" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>这是内部的存活性衰减计数器、 与会话持有的能力数的数量级差值（以 2 为基数）。 达到这个差值时， MDS 会将会话视为静默状态，
并开始回收能力。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">size</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">10B</span></code></p>
</dd>
<dt class="field-odd">see also<span class="colon">:</span></dt>
<dd class="field-odd"><p><a class="reference internal" href="#confval-mds_session_cache_liveness_decay_rate"><code class="xref std std-confval docutils literal notranslate"><span class="pre">mds_session_cache_liveness_decay_rate</span></code></a></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_session_cache_liveness_decay_rate">
<span class="sig-name descname"><span class="pre">mds_session_cache_liveness_decay_rate</span></span><a class="headerlink" href="#confval-mds_session_cache_liveness_decay_rate" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>决定会话需要静默多长时间， MDS 就开始抢先回收能力。 默认值 5 分钟，会导致衰减计数器在 1 小时内减半 10 次，即 1/1024
。 默认指数为 10 （2^10 或 1024），是为了让 MDS 预测， 在 1 小时后之前忙碌的会话（大概）将会静默。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">5</span> <span class="pre">minutes</span></code></p>
</dd>
<dt class="field-odd">see also<span class="colon">:</span></dt>
<dd class="field-odd"><p><a class="reference internal" href="#confval-mds_session_cache_liveness_magnitude"><code class="xref std std-confval docutils literal notranslate"><span class="pre">mds_session_cache_liveness_magnitude</span></code></a></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<p>配置选项 <code class="docutils literal notranslate"><span class="pre">mds_session_cache_liveness_decay_rate</span></code> 表示客户端跟踪能力使用情况的衰减计数器的半衰期。
每次客户端操作或获取能力时， MDS 都会递增计数器。
这是监控客户端缓存使用情况的一种粗略但有效的方法。</p>
<p><code class="docutils literal notranslate"><span class="pre">mds_session_cache_liveness_magnitude</span></code> 是一个以 2 为底的存活性衰减计数器与会话持有的能力数量之差。
因此，假设客户端有 <code class="docutils literal notranslate"><span class="pre">1*2^20</span></code> (1M) 个持有的能力，
但只使用了<strong>少于</strong> <code class="docutils literal notranslate"><span class="pre">1*2^(20-mds_session_cache_liveness_magnitude)</span></code>
（默认时为 1K ）， MDS 就认为客户端处于静默状态并开始回收。</p>
</section>
<section id="id6">
<h2>能力限额<a class="headerlink" href="#id6" title="Permalink to this heading"></a></h2>
<p>MDS 还会尽量避免单个客户端获得过多的能力。
这有助于防止某些情况下，恢复进程花费太长时间。
一般来说，客户端没有必要拥有如此大的缓存。
该限额配置选项如下：</p>
<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_max_caps_per_client">
<span class="sig-name descname"><span class="pre">mds_max_caps_per_client</span></span><a class="headerlink" href="#confval-mds_max_caps_per_client" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>一个客户端可以持有的最大能力数。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">uint</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">1Mi</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<p>不建议把此值设置在 5M 以上，
但也许有的载荷有必要。</p>
</section>
<section id="clients-failing-to-respond-to-cache-pressure">
<h2>处理消息 “clients failing to respond to cache pressure”<a class="headerlink" href="#clients-failing-to-respond-to-cache-pressure" title="Permalink to this heading"></a></h2>
<p>每隔一秒钟（或 <code class="docutils literal notranslate"><span class="pre">mds_cache_trim_interval</span></code> 配置选项设置的间隔），
MDS 就会运行一次“缓存修剪（ cache trim ）”程序。
其中一个步骤是“回收客户端状态（ recall client state ）”。
在此步骤中， MDS 会检查每个客户端（会话），以确定是否需要回收能力。
如果有以下情况，则 MDS 需要回收能力：</p>
<ol class="arabic simple">
<li><p>缓存已满（已超过 <code class="docutils literal notranslate"><span class="pre">mds_cache_memory_limit</span></code> ），需要释放一些 inode</p></li>
<li><p>客户端超过了 <code class="docutils literal notranslate"><span class="pre">mds_max_caps_per_client</span></code> （默认为 1M）</p></li>
<li><p>客户端处于非活动状态</p></li>
</ol>
<p>要确定一个客户端（一个会话）是否处于非活动状态，
需要检查会话的 <code class="docutils literal notranslate"><span class="pre">cache_liveness</span></code> 参数，并与下面的值比较：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">num_caps</span> <span class="o">&gt;&gt;</span> <span class="n">mds_session_cache_liveness_magnitude</span><span class="p">)</span>
</pre></div>
</div>
<p>其中 <code class="docutils literal notranslate"><span class="pre">mds_session_cache_liveness_magnitude</span></code> 是一个配置选项（默认为 <code class="docutils literal notranslate"><span class="pre">10</span></code> ）。
如果 <code class="docutils literal notranslate"><span class="pre">cache_liveness</span></code> 小于这个计算出的值，
此会话将被视为不活动， MDS 会发送 “recall caps （回收能力）” 请求以回收所有缓存的能力（实际的回收值为
<code class="docutils literal notranslate"><span class="pre">num_caps</span> <span class="pre">-</span> <span class="pre">mds_min_caps_per_client(100)</span></code> ）。</p>
<p>在某些情况下，许多 “recall caps” 请求发送得太快，
以至于产生了健康警告： “clients failing to respond to cache pressure
（客户端无法响应缓存压力）” 。如果客户端释放能力的速度不够快，
MDS 会在一秒后重新发送 “recall caps” 请求。这意味着
MDS 将会反复发送 “recall caps” 请求。会话中 “recall caps” 的“total （总）”计数器会不断增加，最终会超过“监视器警告限额”。</p>
<p>由 <code class="docutils literal notranslate"><span class="pre">mds_recall_max_decay_threshold</span></code> 参数（默认为 126K ）控制的节流机制可以降低 “recall caps” 计数器的增长速度，
但有时还是不足以减缓 “recall caps” 计数器的增长速度。
如果更改 <code class="docutils literal notranslate"><span class="pre">mds_recall_max_decay_threshold</span></code> 值仍不足以降低
“recall caps” 计数器的增长速度，那么可以逐步降低 <code class="docutils literal notranslate"><span class="pre">mds_recall_max_caps</span></code> ，
直到日志中不再出现 “clients failing to respond to cache pressure”
（客户端无法响应缓存压力）信息为止。</p>
<section id="id7">
<h3>场景实例<a class="headerlink" href="#id7" title="Permalink to this heading"></a></h3>
<p>这是一个例子。一个客户端缓存了 20k 个能力。在某个时刻，
服务器认为客户端处于非活动状态（因为会话的 <code class="docutils literal notranslate"><span class="pre">cache_liveness</span></code> 值很低）。
服务器开始要求客户端将能力释放到
<code class="docutils literal notranslate"><span class="pre">mds_min_caps_per_client</span></code> 这么多（默认为 100）。
每秒钟，它都会发送 recall_caps ，要求释放 <code class="docutils literal notranslate"><span class="pre">caps_num</span> <span class="pre">-</span> <span class="pre">mds_min_caps_per_client</span></code> 个能力
（但不能超过 <code class="docutils literal notranslate"><span class="pre">mds_recall_max_caps</span></code> ，默认为 30k ）。
客户端开始释放，但释放速度（例如）仅为每秒 100 个能力。</p>
<p>因此，在第一秒内， mds 发送的数量是 recall_caps = 20k - 100 ，
第二秒 recall_caps = (20k - 100) - 100 ，
第三秒 recall_caps = (20k - 200) - 100 ，
以此类推。每次发送 recall_caps 时，都会更新会话的 recall_caps 值，
该值是根据上一分钟发送的 recall_caps 数量计算得出的。也就是说，
计数器会快速增长，最终超过 <code class="docutils literal notranslate"><span class="pre">mds_recall_warning_threshold</span></code> （默认值为 128K），
然后 ceph 就会开始在状态中报告 “failing to respond to cache pressure”
（未能响应缓存压力）警告。现在，当我们将 mds_recall_max_caps 设置为 3K 后，
在这种情况下， mds 服务器每秒只发送 3K 个 recall_caps ，
会话的 recall_caps 最大值应该是（如果 mds 每秒发送 3K 个 recall_caps ，
持续至少一分钟） 60 * 3K = 180K 。这意味着仍有可能达到
<code class="docutils literal notranslate"><span class="pre">mds_recall_warning_threshold</span></code> ，但前提是客户端长时间不“响应”，
而实践证明情况并非如此。</p>
</section>
</section>
</section>



<div id="support-the-ceph-foundation" class="admonition note">
  <p class="first admonition-title">Brought to you by the Ceph Foundation</p>
  <p class="last">The Ceph Documentation is a community resource funded and hosted by the non-profit <a href="https://ceph.io/en/foundation/">Ceph Foundation</a>. If you would like to support this and our other efforts, please consider <a href="https://ceph.io/en/foundation/join/">joining now</a>.</p>
</div>


           </div>
           
          </div>
          <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
        <a href="../standby/" class="btn btn-neutral float-left" title="术语" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
        <a href="../mds-config-ref/" class="btn btn-neutral float-right" title="MDS 配置参考" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
    </div>

  <hr/>

  <div role="contentinfo">
    <p>&#169; Copyright 2016, Ceph authors and contributors. Licensed under Creative Commons Attribution Share Alike 3.0 (CC-BY-SA-3.0).</p>
  </div>

   

</footer>
        </div>
      </div>

    </section>

  </div>
  

  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.Navigation.enable(true);
      });
  </script>

  
  
    
   

</body>
</html>